Micron Document
NexusPi Git Node


Displaying Raw • Download

webconsole/package.sh HEAD (592c826d) Text, 7.01 KB

T8b949e#!/usr/bin/env bash
T8b949e#
T8b949e# Package webconsole/index.html into a smaller delivery artifact.
T8b949e#
T8b949e# Modes:
T8b949e# --strip (default) Remove the ?selftest=1 block; strip comments and
T8b949e# whitespace from HTML/CSS/JS via html-minifier-terser. Does
T8b949e# NOT mangle JS identifiers — output stays readable.
T8b949e# --minify Same as --strip plus full JS mangling and CSS minification.
T8b949e#
T8b949e# Output:
T8b949e# Release/console.html by default. Override with --out PATH.
T8b949e#
T8b949e# Dependencies:
T8b949e# - bash, sed, awk (standard)
T8b949e# - npx + Node.js (for html-minifier-terser, fetched on first run and
T8b949e# cached by npm; no global install required)
T8b949e#
T8b949e# Source is never modified. The packaging script reads the source, slices
T8b949e# the self-test block via SELFTEST-BEGIN / SELFTEST-END sentinels, then
T8b949e# pipes through html-minifier-terser with mode-specific flags.

Tffa657set -euo pipefail

T8b949e# ---- defaults ----
Te6edf3modeTff7b72=Ta5d6ff"strip"
Te6edf3out_default_relTff7b72=Ta5d6ff"Release/console.html"
Te6edf3outTff7b72=Ta5d6ff""
Te6edf3strip_logfilterTff7b72=T79c0ff0
T8b949e# Optional path to a JSON file produced by a separate schema-dump tool. When
T8b949e# provided, the `const BUNDLED_SCHEMA = null;` placeholder in the source is
T8b949e# substituted with the file's contents — letting the web console resolve the
T8b949e# schema with zero network bytes when the device's GetInfo hash matches.
T8b949e# Schema dump format (raw JSON, no wrapper):
T8b949e# {"version": <int>, "hash": <uint32>, "schemaJson": "<schema as serialised JSON string>"}
Te6edf3bundled_schema_fileTff7b72=Ta5d6ff"Tffd700${Te6edf3BUNDLED_SCHEMA_FILETff7b72:-Tffd700}Ta5d6ff"

T8b949e# ---- arg parsing ----
Tff7b72while Tff7b72[Tff7b72[ Te6edf3$# -gt T79c0ff0 Tff7b72]Tff7b72]Tb4b4b4; Tff7b72do
Tff7b72case Ta5d6ff"Te6edf3$1Ta5d6ff" Tff7b72in
--stripTff7b72) Te6edf3modeTff7b72=Ta5d6ff"strip"Tb4b4b4; Tffa657shift Tb4b4b4;Tb4b4b4;
--minifyTff7b72) Te6edf3modeTff7b72=Ta5d6ff"minify"Tb4b4b4; Tffa657shift Tb4b4b4;Tb4b4b4;
--outTff7b72) Te6edf3outTff7b72=Ta5d6ff"Te6edf3$2Ta5d6ff"Tb4b4b4; Tffa657shift T79c0ff2 Tb4b4b4;Tb4b4b4;
--bundled-schemaTff7b72) Te6edf3bundled_schema_fileTff7b72=Ta5d6ff"Te6edf3$2Ta5d6ff"Tb4b4b4; Tffa657shift T79c0ff2 Tb4b4b4;Tb4b4b4;
--strip-logfilterTff7b72) Te6edf3strip_logfilterTff7b72=T79c0ff1Tb4b4b4; Tffa657shift Tb4b4b4;Tb4b4b4;
-hTb4b4b4|--helpTff7b72)
cat Ta5d6ff<<EOF
Usage: $0 [--strip | --minify] [--out PATH] [--bundled-schema FILE] [--strip-logfilter]

--strip (default) Comment + whitespace strip; preserves JS identifiers.
--minify Full minification + JS identifier mangling via terser.
--out Output path. Defaults to Release/console.html relative to the
repo root (one level above this script).
--bundled-schema FILE
Substitute the BUNDLED_SCHEMA placeholder with the JSON contents
of FILE (or set BUNDLED_SCHEMA_FILE env var). Lets the console
skip GetSchema fetches when the device's hash matches.
--strip-logfilter
Also slice out the LOGFILTER-BEGIN..LOGFILTER-END regions
(logs-tab substring + severity filter UI). Off by default; opt in
for size-constrained device builds.
EOF
Tffa657exit T79c0ff0 Tb4b4b4;Tb4b4b4;
*Tff7b72)
Tffa657echo Ta5d6ff"Ta5d6ffUnknown argument: Te6edf3$1Ta5d6ff" >Tb4b4b4&T79c0ff2
Tffa657echo Ta5d6ff"Run with --help for usage." >Tb4b4b4&T79c0ff2
Tffa657exit T79c0ff2 Tb4b4b4;Tb4b4b4;
Tff7b72esac
Tff7b72done

T8b949e# ---- resolve paths ----
Te6edf3script_dirTff7b72=Ta5d6ff"Tff7b72$(Tffa657cd Ta5d6ff"Tff7b72$(dirname Ta5d6ff"Tffd700${Te6edf3BASH_SOURCETb4b4b4[0]Tffd700}Ta5d6ff"Tff7b72)Ta5d6ff" Tff7b72&& Tffa657pwdTff7b72)Ta5d6ff"
Te6edf3repo_rootTff7b72=Ta5d6ff"Tff7b72$(Tffa657cd Ta5d6ff"Te6edf3$script_dirTa5d6ff/..Ta5d6ff" Tff7b72&& Tffa657pwdTff7b72)Ta5d6ff"
Te6edf3srcTff7b72=Ta5d6ff"Te6edf3$script_dirTa5d6ff/index.htmlTa5d6ff"

Tff7b72if Tff7b72[Tff7b72[ -z Ta5d6ff"Te6edf3$outTa5d6ff" Tff7b72]Tff7b72]Tb4b4b4; Tff7b72then
Te6edf3outTff7b72=Ta5d6ff"Te6edf3$repo_rootTa5d6ff/Te6edf3$out_default_relTa5d6ff"
Tff7b72fi

Tff7b72if Tff7b72[Tff7b72[ ! -f Ta5d6ff"Te6edf3$srcTa5d6ff" Tff7b72]Tff7b72]Tb4b4b4; Tff7b72then
Tffa657echo Ta5d6ff"Ta5d6ffSource not found: Te6edf3$srcTa5d6ff" >Tb4b4b4&T79c0ff2
Tffa657exit T79c0ff1
Tff7b72fi

T8b949e# ---- dep check ----
Tff7b72if ! Tffa657command -v npx >/dev/null T79c0ff2>Tb4b4b4&T79c0ff1Tb4b4b4; Tff7b72then
Tffa657echo Ta5d6ff"npx required (install Node.js: https://nodejs.org/)" >Tb4b4b4&T79c0ff2
Tffa657exit T79c0ff1
Tff7b72fi

T8b949e# ---- prepare output dir ----
mkdir -p Ta5d6ff"Tff7b72$(dirname Ta5d6ff"Te6edf3$outTa5d6ff"Tff7b72)Ta5d6ff"

T8b949e# ---- slice SELFTEST block ----
T8b949e# Removes every line from SELFTEST-BEGIN through SELFTEST-END inclusive.
Te6edf3tmp_slicedTff7b72=Ta5d6ff"Tff7b72$(mktemp -t console-sliced.XXXXXX.htmlTff7b72)Ta5d6ff"
Tffa657trap Ta5d6ff'rm -f "$tmp_sliced"' EXIT

Tff7b72if ! grep -q Ta5d6ff"SELFTEST-BEGIN" Ta5d6ff"Te6edf3$srcTa5d6ff"Tb4b4b4; Tff7b72then
Tffa657echo Ta5d6ff"Warning: SELFTEST-BEGIN marker not found in source — self-test block will not be sliced." >Tb4b4b4&T79c0ff2
cp Ta5d6ff"Te6edf3$srcTa5d6ff" Ta5d6ff"Te6edf3$tmp_slicedTa5d6ff"
Tff7b72else
Te6edf3sed_exprTff7b72=Ta5d6ff'/SELFTEST-BEGIN/,/SELFTEST-END/d'
Tff7b72if Tff7b72[Tff7b72[ Ta5d6ff"Te6edf3$strip_logfilterTa5d6ff" Tff7b72=Tff7b72= Ta5d6ff"1" Tff7b72]Tff7b72]Tb4b4b4; Tff7b72then
Tff7b72if ! grep -q Ta5d6ff"LOGFILTER-BEGIN" Ta5d6ff"Te6edf3$srcTa5d6ff"Tb4b4b4; Tff7b72then
Tffa657echo Ta5d6ff"Warning: --strip-logfilter given but LOGFILTER-BEGIN marker not found." >Tb4b4b4&T79c0ff2
Tff7b72fi
Te6edf3sed_exprTff7b72=Ta5d6ff"Te6edf3$sed_exprTa5d6ff;/LOGFILTER-BEGIN/,/LOGFILTER-END/dTa5d6ff"
Tff7b72fi
sed Ta5d6ff"Te6edf3$sed_exprTa5d6ff" Ta5d6ff"Te6edf3$srcTa5d6ff" > Ta5d6ff"Te6edf3$tmp_slicedTa5d6ff"
Tff7b72fi

T8b949e# ---- optional BUNDLED_SCHEMA substitution ----
T8b949e# Replace the placeholder `const BUNDLED_SCHEMA = null;` with the dump file
T8b949e# contents pasted as a JS literal (JSON is a strict subset of JS, so the file
T8b949e# can be inserted verbatim). Done before minification so terser can compress
T8b949e# the inlined JSON.
Tff7b72if Tff7b72[Tff7b72[ -n Ta5d6ff"Te6edf3$bundled_schema_fileTa5d6ff" Tff7b72]Tff7b72]Tb4b4b4; Tff7b72then
Tff7b72if Tff7b72[Tff7b72[ ! -f Ta5d6ff"Te6edf3$bundled_schema_fileTa5d6ff" Tff7b72]Tff7b72]Tb4b4b4; Tff7b72then
Tffa657echo Ta5d6ff"Ta5d6ffBundled schema file not found: Te6edf3$bundled_schema_fileTa5d6ff" >Tb4b4b4&T79c0ff2
Tffa657exit T79c0ff1
Tff7b72fi
Tff7b72if ! grep -q Ta5d6ff"const BUNDLED_SCHEMA = null;" Ta5d6ff"Te6edf3$tmp_slicedTa5d6ff"Tb4b4b4; Tff7b72then
Tffa657echo Ta5d6ff"BUNDLED_SCHEMA placeholder not found in source — refusing to substitute." >Tb4b4b4&T79c0ff2
Tffa657exit T79c0ff1
Tff7b72fi
T8b949e# awk reads the dump file once, then rewrites the placeholder line. Using
T8b949e# awk (not sed) avoids the metacharacter escaping that breaks on arbitrary
T8b949e# JSON content like quotes, slashes, and backslashes inside string values.
Te6edf3tmp_substTff7b72=Ta5d6ff"Tff7b72$(mktemp -t console-subst.XXXXXX.htmlTff7b72)Ta5d6ff"
Tffa657trap Ta5d6ff'rm -f "$tmp_sliced" "$tmp_subst"' EXIT
awk -v Te6edf3dumpTff7b72=Ta5d6ff"Te6edf3$bundled_schema_fileTa5d6ff" Ta5d6ff'
BEGIN {
while ((getline line < dump) > 0) { json = (json == "") ? line : json "\n" line }
close(dump)
}
/const BUNDLED_SCHEMA = null;/ {
sub(/const BUNDLED_SCHEMA = null;/, "const BUNDLED_SCHEMA = " json ";")
}
{ print }
' Ta5d6ff"Te6edf3$tmp_slicedTa5d6ff" > Ta5d6ff"Te6edf3$tmp_substTa5d6ff"
mv Ta5d6ff"Te6edf3$tmp_substTa5d6ff" Ta5d6ff"Te6edf3$tmp_slicedTa5d6ff"
Tffa657echo Ta5d6ff"Ta5d6ffBundled schema substituted from: Te6edf3$bundled_schema_fileTa5d6ff" >Tb4b4b4&T79c0ff2
Tff7b72fi

T8b949e# ---- mode-specific html-minifier-terser flags ----
T8b949e# Pinned to a tested version for reproducibility; bump deliberately.
Te6edf3hmt_pkgTff7b72=Ta5d6ff"html-minifier-terser@7.2.0"

T8b949e# Common flags: strip HTML comments, collapse whitespace, minify inline CSS.
Te6edf3common_flagsTff7b72=Tff7b72(
--collapse-whitespace
--remove-comments
--minify-css Tffa657true
Tff7b72)

Tff7b72if Tff7b72[Tff7b72[ Ta5d6ff"Te6edf3$modeTa5d6ff" Tff7b72=Tff7b72= Ta5d6ff"strip" Tff7b72]Tff7b72]Tb4b4b4; Tff7b72then
T8b949e# Strip JS comments and dead code via terser's compress pass, but keep
T8b949e# identifier names. Output stays readable for delivery-artifact debugging.
Te6edf3js_cfgTff7b72=Ta5d6ff'{"compress":true,"mangle":false,"format":{"comments":false}}'
Tff7b72else
T8b949e# Full minification: terser defaults (compress + mangle), comments dropped.
Te6edf3js_cfgTff7b72=Ta5d6ff'{"compress":true,"mangle":true,"format":{"comments":false}}'
Tff7b72fi

T8b949e# ---- run minifier ----
T8b949e# html-minifier-terser reads from stdin when no file arg is given, but its
T8b949e# CLI works most reliably with a file argument. Feed the sliced temp file.
npx --yes Ta5d6ff"Te6edf3$hmt_pkgTa5d6ff" Tffea00\
Ta5d6ff"Tffd700${Te6edf3common_flagsTb4b4b4[@]Tffd700}Ta5d6ff" Tffea00\
--minify-js Ta5d6ff"Te6edf3$js_cfgTa5d6ff" Tffea00\
Ta5d6ff"Te6edf3$tmp_slicedTa5d6ff" > Ta5d6ff"Te6edf3$outTa5d6ff"

T8b949e# ---- size summary ----
Te6edf3src_bytesTff7b72=Ta5d6ff"Tff7b72$(wc -c < Ta5d6ff"Te6edf3$srcTa5d6ff" Tb4b4b4| tr -d Ta5d6ff' 'Tff7b72)Ta5d6ff"
Te6edf3sliced_bytesTff7b72=Ta5d6ff"Tff7b72$(wc -c < Ta5d6ff"Te6edf3$tmp_slicedTa5d6ff" Tb4b4b4| tr -d Ta5d6ff' 'Tff7b72)Ta5d6ff"
Te6edf3out_bytesTff7b72=Ta5d6ff"Tff7b72$(wc -c < Ta5d6ff"Te6edf3$outTa5d6ff" Tb4b4b4| tr -d Ta5d6ff' 'Tff7b72)Ta5d6ff"

T8b949e# Use awk for the percentage to avoid bc dependency.
Te6edf3pctTff7b72=Ta5d6ff"Tff7b72$(awk -v Te6edf3sTff7b72=Ta5d6ff"Te6edf3$src_bytesTa5d6ff" -v Te6edf3oTff7b72=Ta5d6ff"Te6edf3$out_bytesTa5d6ff" Ta5d6ff'BEGIN{printf "%.1f", (s-o)*100.0/s}'Tff7b72)Ta5d6ff"

Tffa657printf Ta5d6ff'%s\n' Ta5d6ff"----- webconsole package summary -----"
Tffa657printf Ta5d6ff' mode: %s\n' Ta5d6ff"Te6edf3$modeTa5d6ff"
Tffa657printf Ta5d6ff' source: %8s bytes %s\n' Ta5d6ff"Te6edf3$src_bytesTa5d6ff" Ta5d6ff"Te6edf3$srcTa5d6ff"
Tffa657printf Ta5d6ff' after slice: %8s bytes (SELFTEST block removed)\n' Ta5d6ff"Te6edf3$sliced_bytesTa5d6ff"
Tffa657printf Ta5d6ff' output: %8s bytes %s\n' Ta5d6ff"Te6edf3$out_bytesTa5d6ff" Ta5d6ff"Te6edf3$outTa5d6ff"
Tffa657printf Ta5d6ff' saved: %s%% vs source\n' Ta5d6ff"Te6edf3$pctTa5d6ff"

Served by rngit 1.5.2 - Generated in 0.02s